#ifndef LECTEURFONCTION_H_
#define LECTEURFONCTION_H_

#include "Symbole.h"
#include "LecteurSymbole.h"
#include "TableSymboles.h"
#include "Multype.h"
#include <stack>
#include "Arbre.h"
#include <string>
#include "Lecteur.h"
using namespace std;



class LecteurFonction : public Lecteur
{
  public:
    LecteurFonction(LecteurSymbole *ls);
    // Construit un lecteur de fonction pour analyser une déclaration de fonction
    //    et bâtir les représentations nécessaires à son exécution.
    // ls référence un lecteur de symbole dont le symbole courant est
    //    le 1er symbole de la déclaration.
    // Après l'analyse, le symbole courant sera le premier symbole qui suit la déclaration.

    inline int operator == (string ch) { return nom == ch; } // renvoie vrai si nom=ch

    inline void afficher(int indentation = 0) {arbre->afficher(indentation);}
    vector<SymboleValue*> & getParam();
    Noeud* getArbre ();
    string getCode(int indent);

    inline string getNom() {return nom;}

private:

   string         nom;			// le nom (l'identificateur) de la fonction
   unsigned short nbParam;    	// le nombre de paramètres de la fonction
   vector<SymboleValue*> param; // pointeurs sur les symboles paramètre dela fonction (afin de leur assigner les valeurs lors d'un appel)
   // implémentation de la grammaire d'une déclaration de fonction

    Noeud* declFonction(); // <decl_fonction> ::= fonction <variable> (<variable>{,<variable>}) = {<seq_inst>} retourner <expression>


    //******** Fonctions complémentaires *********//

    Noeud* inst();		// <inst>	::= <affectation> | <instSi> | <instTq> | <instRepeter> | <instRetourner>
    Noeud* instRetourner(); // <instRetourner> ::= retourner <expression>
};

#endif
